#ifndef __INF_FOURWAYKEY_H__
#define __INF_FOURWAYKEY_H__

#include "App_Flank.h"
#include "App_Massage.h"
#include "Common_Config.h"
#include "Driver_ADC.h"

#include <stdbool.h>

/* 按键状态枚举 */
typedef enum
{
    KEY_STATE_IDLE = 0,    // 空闲状态
    KEY_STATE_DEBOUNCE,    // 消抖状态
    KEY_STATE_SHORT_PRESS, // 短按状态
    KEY_STATE_LONG_PRESS,  // 长按状态
    KEY_STATE_RELEASE      // 释放状态
} KeyState_e;

/* 按键事件枚举 */
typedef enum
{
    KEY_EVENT_NONE = 0,    // 无事件
    KEY_EVENT_SHORT_PRESS, // 短按事件
    KEY_EVENT_LONG_PRESS,  // 长按事件
    KEY_EVENT_RELEASE,     // 释放事件
    KEY_EVENT_CONTINUOUS   // 连续事件（连续模式专用）
} KeyEvent_e;

/* 按键类型枚举 */
typedef enum
{
    KEY_TYPE_NONE = 0, // 无按键
    KEY_TYPE_UP,       // 上键
    KEY_TYPE_DOWN,     // 下键
    KEY_TYPE_LEFT,     // 左键
    KEY_TYPE_RIGHT,    // 右键
    KEY_TYPE_MIDDLE,   // 中键
    KEY_TYPE_MAX       // 按键数量
} KeyType_e;

/* 按键模式枚举 */
typedef enum
{
    KEY_MODE_SINGLE = 0, // 单次模式：松开才触发一次事件
    KEY_MODE_CONTINUOUS  // 连续模式：按下持续触发事件
} KeyMode_e;

/* 按键状态结构体 */
typedef struct
{
    KeyState_e state;          // 当前状态
    KeyEvent_e event;          // 当前事件
    uint32_t   pressTime;      // 按下时间计数
    bool       isPressed;      // 是否被按下
    KeyMode_e  mode;           // 按键模式
    uint32_t   continuousTime; // 连续触发计时器
} KeyStatus_t;

/* 按键工作模式 */
typedef enum
{
    KEY_WORK_MODE_NONE = 0,       // 无工作模式
    KEY_WORK_MODE_MASSAGE,        // 按摩模式
    KEY_WORK_MODE_FLANK,          // 侧翼模式
    KEY_WORK_MODE_LUMBAR_SUPPORT, // 腰托模式
    KEY_WORK_MODE_MAX
} KeyWorkMode_e;

/* 按键回调函数类型 */
typedef void (*KeyCallback_t)(KeyType_e keyType, KeyEvent_e keyEvent);

/* 按键配置 */
typedef struct
{
    KeyWorkMode_e keyWorkMode; // 工作模式

    KeyCallback_t keyCallback; // 回调函数指针
} KeyConfig;

extern KeyConfig keyConfig;    // 按键配置

/**
 * @brief 初始化四向按键
 */
void Inf_FourwayKey_Init(void);

/**
 * @brief 注册按键回调函数
 *
 * @param callback 回调函数指针
 */
void Inf_FourwayKey_RegisterCallback(KeyCallback_t callback);

/**
 * @brief 按键定时处理函数
 *
 * @note 在定时器中断中调用，建议10ms调用一次
 */
void Inf_FourwayKey_TimerHandler(void);

/**
 * @brief 获取按键状态
 *
 * @param keyType 按键类型
 * @return true 按键被按下
 * @return false 按键未被按下
 */
bool Inf_FourwayKey_GetState(KeyType_e keyType);

/**
 * @brief 获取按键事件
 *
 * @param keyType 按键类型
 * @return KeyEvent_e 按键事件
 */
KeyEvent_e Inf_FourwayKey_GetEvent(KeyType_e keyType);

/**
 * @brief 清除按键事件
 *
 * @param keyType 按键类型
 */
void Inf_FourwayKey_ClearEvent(KeyType_e keyType);

/**
 * @brief 设置按键模式
 *
 * @param keyType 按键类型
 * @param mode 按键模式
 */
void Inf_FourwayKey_SetMode(KeyType_e keyType, KeyMode_e mode);

/**
 * @brief 获取按键模式
 *
 * @param keyType 按键类型
 * @return KeyMode_e 按键模式
 */
KeyMode_e Inf_FourwayKey_GetMode(KeyType_e keyType);

/**
 * @brief 设置连续模式触发间隔
 *
 * @param interval 触发间隔（单位：10ms）
 */
void Inf_FourwayKey_SetContinuousInterval(uint32_t interval);

/**
 * @brief 选择按键回调函数
 *
 * @param keyWorkMode 按键工作模式
 */
void Inf_FourwayKey_SelectKeyCallback(KeyWorkMode_e keyWorkMode);

#endif
